﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;

//namespace ArgusPCLib.Mathematics
//{
//	public static class Math
//	{
//		/// <summary>
//		/// Returns the greatest common divisor.
//		/// </summary>
//		public static Integer GCD(Integer a, Integer b) { return Integer.GCD(a, b); }

//		public static decimal GCD(decimal a, decimal b)
//		{
//			decimal sign = decimal.One;
//			if (a < 0)
//			{
//				sign = decimal.Negate(sign);
//				a = decimal.Negate(a);
//			}
//			if (b < 0)
//			{
//				sign = decimal.Negate(sign);
//				b = decimal.Negate(b);
//			}

//			if (a < b)
//				return Math.GCD(b, a) * sign;

//			{
//				int p = a.GetLengthOfDecimalFraction();
//				if (p > 0)
//					throw new ArgumentException("Value must be an integer.", "a");
//				p = b.GetLengthOfDecimalFraction();
//				if (p > 0)
//					throw new ArgumentException("Value must be an integer.", "b");
//			}

//			while (b > 0)
//			{
//				decimal r = decimal.Remainder(a, b);
//				a = b;
//				b = r;
//			}
//			return sign * a;
//		}

//		/// <summary>
//		/// Returns the least common multiply.
//		/// </summary>
//		public static Integer LCM(Integer a, Integer b) { return Integer.LCM(a, b); }

//		public static decimal LCM(decimal a, decimal b)
//		{
//			if (a == decimal.Zero && b == decimal.Zero)
//				return decimal.Zero;
//			decimal gcd = Math.GCD(a, b);
//			return System.Math.Abs(a * b) / gcd;
//		}

//		public static Integer Abs(Integer integer) { return Integer.Abs(integer); }

//		public static Integer Power(Integer b, int e) { return Integer.Power(b, e); }
//	}

//	public static class Math<T> where T:IScalar
//	{
//		public static T Power(T b, int e)
//		{
//			IScalar one = ScalarHelper<T>.GetOne();
//			IScalar result = one;
//			IScalar a = b;
//			uint E = (uint)System.Math.Abs(e);

//			while (E > 0)
//			{
//				if ((E & 1) == 1)
//					result = result.Multiply(b);
//				a = a.Multiply(a);
//				E >>= 1;
//			}

//			if (e < 0)
//				result = one.Divide(result);
//			return (T)result;
//		}
//	}
//}
